Day 22 함수(메소드), 조건문 활용
Day22 22단계 2023-11-11
1. 0 빼기
- 내 풀이 : n_str에서 0이 아닌 숫자가 등장하는 index를 구하고, 그 위치부터 n_str의 마지막까지 잘랐다.
class Solution {
public String solution(String n_str) {
int index = 0;
for (int i = 0; i < n_str.length(); i++) {
if (n_str.charAt(i) != '0') {
index = i;
break;
}
}
return n_str.substring(index, n_str.length());
}
}
- 다른 사람 풀이 : n_str를 Integer로 바꿔 앞쪽 0을 지우고 다시 String으로 변환했다.
2. 두 수의 합
- 내 풀이 : BigDecimal 클래스를 사용하여 큰 숫자의 처리를 진행했다.
- 다만 처리 속도가 매우 느리다.
import java.math.BigDecimal;
class Solution {
public String solution(String a, String b) {
BigDecimal aBig = new BigDecimal(a);
BigDecimal bBig = new BigDecimal(b);
return String.valueOf(aBig.add(bBig));
}
}
- 다른 사람 풀이 : BigInteger 클래스를 사용하여 연산을 진행했다.
BigInteger aBig = new BigInteger(a);
BigInteger bBig = new BigInteger(b);
return String.valueOf(aBig.add(bBig));
- 두 코드의 처리 시간이 궁금해서 비교해보았다.
- 다른 사람 풀이의 코드 원본 : https://school.programmers.co.kr/learn/courses/30/lessons/181846/solution_groups?language=java
- 챗 gpt 답변에 따르면 BigDecimal은 실수 및 소수점 이하 숫자를 다루는데 특화되어 있기 때문에 정수 연산에 특화된 BigInteger보다 속도가 느리다고 한다.
BigInteger와BigDecimal은 각각 정수와 실수를 정밀하게 다룰 수 있는 클래스입니다. 그러나 이 두 클래스는 내부적으로 다른 구현을 가지고 있기 때문에 연산 속도에서 차이가 날 수 있습니다.
- 내부 구현:
BigInteger는 정수 연산에 특화되어 있으며, 내부적으로 정수를 다루는 방식으로 구현되어 있습니다.BigDecimal은 실수 연산에 특화되어 있으며, 내부적으로 소수점 이하의 숫자를 다루는 방식으로 구현되어 있습니다.
- 연산의 복잡성:
BigDecimal은 실수를 다루기 때문에 연산이 보다 복잡할 수 있습니다. 부동 소수점 문제에 대응하기 위해 반올림, 정규화 등의 추가적인 연산이 필요합니다.BigInteger는 정수 연산만을 다루기 때문에 상대적으로 연산이 단순합니다.
- 성능 영향:
BigDecimal은 정밀한 실수 연산을 위해 추가적인 연산이 필요하기 때문에 연산이 느릴 수 있습니다.BigInteger는 정수 연산만 다루기 때문에 좀 더 빠를 수 있습니다.
- 크기와 정확도:
BigDecimal이 더 큰 범위의 수와 정밀한 소수 연산을 다룰 수 있지만, 그에 따른 성능 손실이 발생할 수 있습니다.BigInteger는 큰 정수 값을 다루기에 적합하며, 정확도는 유지되면서 빠른 연산이 가능합니다.
- 성능 차이가 발생하는 구체적인 상황은 코드에 따라 다를 수 있습니다. 특히, 실수 연산에서는 부동 소수점 연산의 한계와 부정확성에 유의해야 합니다. 프로그램의 요구 사항에 따라서
BigInteger또는BigDecimal을 선택하고, 성능 측면에서도 실제 상황에서 테스트하여 적절한 선택을 할 필요가 있습니다.
- 그래서 결과를 비교해보던 중 다른 사람의 원본 코드가 BigInteger를 사용했음에도 BigDecimal을 사용한 내 코드보다 대부분 느려서 이상함을 느껴서 다시 확인해보았다.
- 원인은 출력 부분에서
String answer = ""; return answer += A.add(B)로 출력한 것 같아 String.valueOf()로 출력했더니 속도가 빨라졌다.
4. 배열의 원소 삭제하기
- 내 풀이 : delete_list에 포함되지 않는 arr 배열 요소의 인덱스를 저장할 index 배열을 만든다.
- 만약 arr 배열 요소가 delete_list 배열 요소와 겹치는 요소가 있다면 index 배열에서 그 인덱스 위치의 값을 1로 저장한다.
- 그 후 index 배열에서 0의 개수를 구해 answer 배열의 크기로 설정한다.
- answer 배열에서 index 배열 요소가 0인 경우의 인덱스만 판별하여 arr 배열의 해당 인덱스 요소를 answer 배열 요소로 저장한다.
import java.util.*;
class Solution {
public int[] solution(int[] arr, int[] delete_list) {
int[] index = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < delete_list.length; j++) {
if (arr[i] == delete_list[j]) index[i] = 1;
}
}
int size = 0;
for (int i = 0; i < index.length; i++) {
if (index[i] == 0) size++;
}
int[] answer = new int[size];
int idx = 0;
for (int i = 0; i < index.length; i++) {
if (index[i] == 0) answer[idx++] = arr[i];
}
return answer;
}
}
- 다른 사람 풀이 : List, Stream 등을 이용하여 두 배열 간의 중복 요소를 비교하고 제거했다.
- 궁금해서 간단한 처리 속도 비교를 진행했다.
- 다른 사람 풀이 원본코드 : https://school.programmers.co.kr/learn/courses/30/lessons/181844/solution_groups?language=java
- int 배열을 사용한 결과가 List를 사용한 결과보다는 빠르지만, 코드 길이 및 복잡성은 int 배열이 복잡하다.
- 다만 1 ms도 걸리지 않는 문제 테스트에서 이 정도의 속도 차이가 유의미한지는 잘 모르겠다.
- 두 코드의 메모리 사용량은 비슷하다.
- 문제에서 주어지는 조건과 기타 사항을 고려해서 둘 중 하나를 선택해서 풀면 될 것 같다.